﻿#region GNU General Public License
/*
-----------------------------------------------------------------------------
This source file is part of jscc
    (Javascript with Classes)
For the latest info, see http://code.google.com/p/jscc

Copyright (c) 2011 Tapani Valkonen

jscc is free software: you can redistribute it and/or modify it under 
the terms of the GNU General Public License as published by the 
Free Software Foundation, either version 3 of the License, or (at your option)
any later version. 
 
jscc is distributed in the hope that it will be useful, 
but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 
for more details.

You should have received a copy of the GNU General Public License 
along with jscc. If not, see http://www.gnu.org/licenses/.
-----------------------------------------------------------------------------
*/
#endregion

using System;
using System.Collections.Generic;
using System.Text;

namespace jscc
{
    public abstract class CodeWriter
    {
        protected string content;
        protected int index;
        protected int indent;

        protected bool wasLineChange = false;

        public CodeWriter()
        {
            content = "";
            index = 0;
            indent = 0;
        }

        public abstract void BeginBlock();
        // TODO: Remove bool semi
        public abstract void EndBlock(bool semi);
        public void EndBlock()
        {
            EndBlock(false);
        }

        public void WriteLineEnd()
        {
            Write(Environment.NewLine);
            wasLineChange = true;
        }

        public void Write(string text)
        {
            if (string.IsNullOrEmpty(text)) return;

            if (wasLineChange)
            {
                text = text.PadLeft(text.Length + indent * 2, ' ');
                wasLineChange = false;
            }

            StringBuilder builder = new StringBuilder();
            builder.Append(content.Substring(0, index));
            builder.Append(text);
            builder.Append(content.Substring(index, content.Length - index));

            content = builder.ToString();

            index += text.Length;
        }

        public void IncreaseIndent()
        {
            indent++;
        }

        public void DecreaseIndent()
        {
            indent--;
            if (indent < 0) indent = 0;
        }

        public string Content
        {
            get { return content; }
        }
    }
}
